package flow

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking


private fun simple(): Flow<Int> = flow {
    for (i in 1..3) {
        delay(500)
        emit(i)
    }
}


fun main(args: Array<String>) {
    runBlocking {
        simple().collect {
            println("value: $it")
        }

        // toList .toSet
        println("simple to list: ${simple().toList()}")

        // first，获取第一个元素。single 则是 有且仅有一个，否则 报错。
        val first = simple().first()
//        val first = simple().single()
        println("simple first: $first")

        // reduce，类加 组成一个值。 fold 相比 reduce，多了一个 初始值
        val count = simple().reduce { accumulator, value ->
            accumulator + value
        }
        println("simple count: $count")


        // 对于 产生 和 消费，不平衡。一般就有 缓冲、合并 概念。

    }
}